package br.com.velp.sudecap.entidade;

import br.com.velp.sudecap.hibernate.intercept.Auditable;
import br.com.velp.sudecap.hibernate.intercept.Unauditable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 06.11.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF001.02 - Listar Usuários / RF001.03 - Cadastrar Usuários </requisitos_afetados>
 * <descricao> Bean Responsável Pelo Mapeamento da Tabela USUARIO </descricao>
 * </sumario>
 */
@Entity
@Table(name = "USUARIO")
@Auditable(logTableName = "USUARIO_LOG")
public class Usuario extends EntityBase {

    public static final Long serialVersionUID = 1l;
    
    @Id
    @SequenceGenerator(name = "SQ_ID_USU", sequenceName = "SQ_ID_USU", allocationSize = 1)
    @GeneratedValue(generator = "SQ_ID_USU")
    @Column(name = "ID_USU", nullable = false, unique = true)
    private Long id;
    
    @Column(name = "USU_CADASTRO")
    @Unauditable
    private Long idUsuarioCadastro;
    
    @Column(name = "USU_ALTERACAO")
    @Unauditable
    private Long idUsuarioAlteracao;
    
    @Column(name = "MATRICULA", length = 8)
    private Integer matricula;
    
    @Column(name = "NOME", length = 150, nullable = false)
    private String nome;
    
    @Column(name = "LOGIN", length = 20, nullable = false)
    private String login;
    
    @Column(name = "SENHA", length = 32, nullable = false)
    private String senha;
    
    @Column(name = "FONE_1", length = 20)
    private String telefone01;
    
    @Column(name = "FONE_2", length = 20)
    private String telefone02;
    
    @Column(name = "EMAIL", length = 100, nullable = false)
    private String email;
    
    @Column(name = "CPF", length = 11)
    private String cpf;
    
    @Column(name = "FLG_ATIVO", nullable = false)
    private Boolean ativo;
    
    @Column(name = "DATA_CADASTRO", nullable = false)
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    @Unauditable
    private Date dataCadastro;
    
    @Column(name = "DATA_ALTERACAO")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    @Unauditable
    private Date dataAlteracao;
    
    @ManyToOne
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name = "ID_DIRETORIA")
    private Diretoria diretoria;
    
    @ManyToOne
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name = "ID_SETOR")
    private Setor setor;
    
    @ManyToOne
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name = "ID_LOCAL")
    private Local local;
    
    @ManyToOne
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name = "ID_ANDAR")
    private Andar andar;
    
    @OneToMany(mappedBy = "usuario", orphanRemoval = true)
    @Unauditable
    private List<DireitoUsuario> direitosUsuario = new ArrayList<DireitoUsuario>();

    public Usuario() {
    }

    public Usuario(Long id) {
	this.id = id;
    }

    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    public Long getIdUsuarioAlteracao() {
	return idUsuarioAlteracao;
    }

    public void setIdUsuarioAlteracao(Long idUsuarioAlteracao) {
	this.idUsuarioAlteracao = idUsuarioAlteracao;
    }

    public Long getIdUsuarioCadastro() {
	return idUsuarioCadastro;
    }

    public void setIdUsuarioCadastro(Long idUsuarioCadastro) {
	this.idUsuarioCadastro = idUsuarioCadastro;
    }

    public Integer getMatricula() {
	return matricula;
    }

    public void setMatricula(Integer matricula) {
	this.matricula = matricula;
    }

    public void setIdDiretoria(Long idDiretoria){
	setDiretoria(idDiretoria != null ? new Diretoria(idDiretoria) : null);
    }
    
    public Long getIdDiretoria(){
	return getDiretoria() != null ? getDiretoria().getId() : null;
    }
    
    public void setIdSetor(Long idSetor){
	setSetor(idSetor != null ? new Setor(idSetor) : null);
    }
    
    public Long getIdSetor(){
	return getSetor() != null ? getSetor().getId() : null;
    }
    
    public void setIdLocal(Long idLocal){
	setLocal(idLocal != null ? new Local(idLocal) : null);
    }
    
    public Long getIdLocal(){
	return getLocal() != null ? getLocal().getId() : null;
    }
    
    public void setIdAndar(Long idAndar) {
        setAndar(idAndar != null ? new Andar(idAndar) : null);
    }
    
    public Long getIdAndar() {
        return getAndar() != null ? getAndar().getId() : null;
    }
    
    public String getAtivoStr() {
	if (this.ativo == null) {
	    return null;
	} else if (this.ativo) {
	    return "Ativo";
	} else {
	    return "Inativo";
	}
    }

    public Boolean getAtivo() {
	return ativo;
    }

    public void setAtivo(Boolean ativo) {
	this.ativo = ativo;
    }

    public String getEmail() {
	return email;
    }

    public void setEmail(String email) {
	this.email = email;
    }

    public String getLogin() {
	return login;
    }

    public void setLogin(String login) {
	this.login = login;
    }

    public String getNome() {
	return nome;
    }

    public void setNome(String nome) {
	this.nome = nome;
    }

    public String getSenha() {
	return senha;
    }

    public void setSenha(String senha) {
	this.senha = senha;
    }

    public String getTelefone01() {
	return telefone01;
    }

    public void setTelefone01(String telefone01) {
	this.telefone01 = telefone01;
    }

    public String getTelefone02() {
	return telefone02;
    }

    public void setTelefone02(String telefone02) {
	this.telefone02 = telefone02;
    }

    public String getCpf() {
	return cpf;
    }

    public void setCpf(String cpf) {
	this.cpf = cpf;
    }

    public Date getDataAlteracao() {
	return dataAlteracao;
    }

    public void setDataAlteracao(Date dataAlteracao) {
	this.dataAlteracao = dataAlteracao;
    }

    public Date getDataCadastro() {
	return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
	this.dataCadastro = dataCadastro;
    }

    public Diretoria getDiretoria() {
	return diretoria;
    }

    public void setDiretoria(Diretoria diretoria) {
	this.diretoria = diretoria;
    }

    public Local getLocal() {
	return local;
    }

    public void setLocal(Local local) {
	this.local = local;
    }

    public Setor getSetor() {
	return setor;
    }

    public void setSetor(Setor setor) {
	this.setor = setor;
    }

    public Andar getAndar() {
        return andar;
    }

    public void setAndar(Andar andar) {
        this.andar = andar;
    }

    public List<DireitoUsuario> getDireitosUsuario() {
	return direitosUsuario;
    }

    public void setDireitosUsuario(List<DireitoUsuario> direitosUsuario) {
	this.direitosUsuario = direitosUsuario;
    }

}
